home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / CONVERT.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  6KB  |  189 lines

  1. ;================================================
  2. ; CONVERT By Eric Tauck
  3. ;
  4. ; This program converts a binary file to a text
  5. ; format suitable for inclusion into a Turbo C or
  6. ; or Turbo Pascal program.
  7. ;
  8. ; The usage is:
  9. ;
  10. ;   CONVERT [c | pascal] < input_file > output_file
  11. ;
  12. ; The input file is any existing file, probably
  13. ; an assembled WASM program.  The output_file
  14. ; will be created (or overwritten if it already
  15. ; exists).  The output is either formatted for
  16. ; the Turbo C __emit__ statement or the Turbo
  17. ; Pascal Inline statement.
  18. ;
  19. ; This program makes use of the WASM library
  20. ; files.
  21.  
  22.         INCLUDE 'library\start.asm'
  23.         INCLUDE 'library\parms.asm'
  24.         INCLUDE 'library\string.asm'
  25.         INCLUDE 'library\case1.asm'
  26.         INCLUDE 'library\case2.asm'
  27.         INCLUDE 'library\convert.asm'
  28.         INCLUDE 'library\file.asm'
  29.  
  30. STDIN           EQU     0       ;standard input device handle
  31. STDOUT          EQU     1       ;standard output device handle
  32.  
  33. WIDTH           EQU     10      ;number of numbers across
  34.  
  35. P_FORMAT        EQU     0       ;use Pascal format
  36. C_FORMAT        EQU     1       ;use C format
  37.  
  38. ;--- program entry point, determine format
  39.  
  40.         mov     format, P_FORMAT        ;default format
  41.         mov     si, OFFSET p_sep        ;Pascal separator
  42.         call    ParGet                  ;get next parameter
  43.         jc      main1                   ;jump if none
  44.         mov     di, ax
  45.         call    StrUpr                  ;convert to uppercase
  46.         mov     bx, di
  47.         mov     ax, OFFSET p_str        ;Pascal option
  48.         call    StrCmp                  ;check if matches
  49.         jnc      main1                  ;jump if so
  50.         mov     format, C_FORMAT        ;default format
  51.         mov     si, OFFSET c_sep        ;C separator
  52.         mov     bx, di
  53.         mov     ax, OFFSET c_str        ;C option
  54.         call    StrCmp                  ;check if matches
  55.         jc      main6                   ;jump if not
  56.  
  57. ;--- loop for each input byte
  58.  
  59. main1   sub     di, di          ;zero bytes in row
  60.         jmp     main5
  61.  
  62. main2   or      di, di          ;check if any bytes yet
  63.         jz      main3
  64.         push    ax
  65.         mov     ax, si          ;separator
  66.         call    output          ;output
  67.         pop     ax
  68.  
  69. main3   cmp     di, WIDTH               ;check if too wide
  70.         jb      main4
  71.         push    ax
  72.         mov     ax, OFFSET eolstr       ;end of line string
  73.         call    output
  74.         sub     di, di                  ;reset column count
  75.         pop     ax
  76.  
  77. main4   call    putnum          ;output byte
  78.         jc      main6           ;exit loop if error
  79.         inc     di              ;increment bytes in this row
  80.  
  81. main5   call    input           ;get a byte of input
  82.         jnc     main2           ;loop if byte returned
  83.  
  84. ;--- finished
  85.  
  86.         mov     ax, 4C00H       ;exit with no error code
  87.         int     21H             ;execute
  88.  
  89. ;--- error
  90.  
  91. main6   mov     ax, 4CFFH       ;exit with error code
  92.         int     21H             ;execute
  93.  
  94. ;--- data
  95.  
  96. p_str   DB      'PASCAL',0      ;Pascal type
  97. p_sep   DB      '/',0           ;Pascal separator
  98. c_str   DB      'C',0           ;C type
  99. c_sep   DB      ',',0           ;C separator
  100. eolstr  DB      13,10,0         ;end of line string
  101.  
  102. ;========================================
  103. ; Output a 8 bit number.
  104. ;
  105. ; In: AL= number.
  106.  
  107. putnum  PROC    NEAR
  108.         push    ax
  109.         mov     ax, OFFSET pstart       ;Pascal header
  110.         cmp     format, P_FORMAT        ;check if Pascal
  111.         je      putnum1                 ;jump if so
  112.         mov     ax, OFFSET cstart       ;C header
  113. putnum1 call    output                  ;output header
  114.         pop     ax                      ;restore value
  115.         call    maknum                  ;convert to number
  116.         call    output                  ;output number
  117.         ret
  118.  
  119. pstart  DB      '$',0           ;Pascal number header
  120. cstart  DB      '0x',0          ;C number header
  121.         ENDP
  122.  
  123. ;========================================
  124. ; Convert an 8 bit number to a string.
  125. ;
  126. ; In: AL= number.
  127. ;
  128. ; Out: AX= string address.
  129.  
  130. maknum  PROC    NEAR
  131.         sub     dx, dx                  ;
  132.         sub     ah, ah                  ;number in DX:AX
  133.         mov     cx, 16                  ;base
  134.         mov     bx, OFFSET numbuff      ;place to put number
  135.         call    Num2Str                 ;convert to string
  136.         mov     ax, OFFSET numbuff      ;number string
  137.         call    StrLen                  ;get length
  138.         sub     ax, 2
  139.         add     ax, OFFSET numbuff      ;add a preceding zero if necessary
  140.         ret
  141.  
  142.         DB      '0'             ;preceding zero
  143. numbuff DS      3               ;2 digits and a null terminator
  144.         ENDP
  145.  
  146. ;========================================
  147. ; Send a string to the standard output
  148. ; device.
  149. ;
  150. ; In: AX= string address; CY= set if
  151. ;     error.
  152.  
  153. output  PROC    NEAR
  154.         push    ax
  155.         call    StrLen          ;get bytes to write
  156.         mov     cx, ax
  157.         pop     ax
  158.         mov     dx, ds
  159.         mov     bx, STDOUT      ;device handle
  160.         call    FilWri          ;write to file
  161.         ret
  162.         ENDP
  163.  
  164. ;========================================
  165. ; Read a byte from the standard input
  166. ; device.
  167. ;
  168. ; Out: AL= byte; CY= set if EOF
  169. ;      (or error).
  170.  
  171. input   PROC    NEAR
  172.         mov     ax, OFFSET inpbuf
  173.         mov     dx, ds
  174.         mov     bx, STDIN       ;device handle
  175.         mov     cx, 1           ;read byte
  176.         call    FilRea          ;read from file
  177.         mov     al, inpbuf      ;load byte
  178.         ret
  179. inpbuf  DB      ?               ;single byte input buffer
  180.         ENDP
  181.  
  182. ;========================================
  183. ; Uninitialized data.
  184.  
  185. format  LABEL   BYTE            ;current format
  186.         ORG     +1
  187.  
  188. END
  189.